#ifndef _SET_H
#define _SET_H

#include "common.h"

uint setSize; 
uint setAll;

typedef struct Set {
  //uint size;   
	uint count; // velikost mnoziny
  uint data[0]; // pole
} Set;


void SetInit(uint size);
Set* SetCreate();
Set* SetCopy(Set* s);
int SetSave(Set* s, char** pBuf);
Set* SetLoad(char** pBuf);
void SetDestroy(Set* s);
int SetIsSubset(Set* set, Set* subset);
static int SetCmp(Set* s1, Set* s2);
int SetIsIn(Set* s, uint index);
void SetAdd(Set* s, uint index);
void SetRemove(Set* s, uint index);
void SetInvert(Set* s);
Set* SetInvertCopy(Set* s);
int* SetArray_(Set* s, int inSet);
static int* SetArray(Set* s);
static int* SetInvertArray(Set* s);


static inline int SetCmp(Set* s1, Set* s2) {
  if(s1->count != s2->count) return -1;
  int i; for(i=0; i<setAll; ++i) {
    if( (s1->data[i] > s2->data[i]) ) return 1;
    if( (s1->data[i] < s2->data[i]) ) return -1;
  }
  return 0;
}

static inline int* SetArray(Set* s) { return SetArray_(s,1); }
static inline int* SetInvertArray(Set* s) { return SetArray_(s,0); }

#endif
